package com.shujia

import scala.collection.mutable

object Demo15Map {
  def main(args: Array[String]): Unit = {
    /**
     * Map散列：每个元素都是KV格式
     * 一般用于查询的场景，通过K可以快速地获取V
     * 默认是在immutable包里的所以也是不可变的
     * K是不能重复的，后面的KV会覆盖前面定义的KV
     * 无序的
     */

    val map01: Map[String, Int] = Map[String, Int](("k1", 1), Tuple2("k2", 2), "k3" -> 2, "k1" -> 11)
    println(map01)

    /**
     * 除了sort相关的那几个操作之外，基本的方法都有
     * map、flatMap、filter、foreach、groupBy
     */
    println(map01.keys)
    println(map01.values)
    println(map01.map(kv => kv._2))

    // 按照value进行分组
    map01.groupBy(kv => kv._2).map(kv => kv)

    // 通过key获取value
    println(map01("k2"))
    //    println(map01("kk2")) // 如果Key不存在则直接报错

    /**
     * Option类型：抽象地，有两个子类
     * 有值的时候会返回Some类型
     * 值不存在的时候会返回None类型
     * 如果在Scala中调用了某个方法返回值类型为Option
     * 那么在调用之后一定要处理有值以及没有值的两种情况
     *
     * 可以借助match来处理
     */
    println(map01.get("k2")) // 存在则返回Some(v)
    println(map01.get("kk2")) // 不存在则返回None
    val key: String = "kk3"
    map01.get(key) match {
      case Some(v) =>
        println(v + 100)
      case None =>
        println("Key不存在")
    }

    println(map01.getOrElse("k2", 0)) // 实际上调用的还是get方法，只不过自动加上了match进行处理
    println(map01.getOrElse("kk2", 0)) // 不存在则返回默认值

    /**
     * HashMap/mutable.Map：可变的Map
     */
    val map02: mutable.Map[String, Double] = mutable.Map[String, Double]("k1" -> 1.1, "k2" -> 2.2)
    // 增加KV键值对
    map02.+=("k3" -> 3.3)
    map02("k4") = 4.4
    map02.put("k5", 5.5)
    println(map02)

    // 移除KV
    map02.-=("k4")
    println(map02)
    map02.remove("k2")
    println(map02)

    // 修改V
    map02("k1") = 1.11
    println(map02)
    map02.update("k3", 3.333)
    println(map02)

  }

}
